/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	EntityInfoBuffer.java
 * 模块说明：	
 * 修改历史：
 * Dec 11, 2007 - lxm - 创建。
 */
package com.hd123.rumba.gwt.cpnts.filter.client;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.cpnts.filter.client.biz.ClassTypeInfo;

/**
 * 实体信息缓冲
 * <p>
 * 
 * 其中记录数据可以被看作是内存二维数据表，包含了以下字段：
 * <ol>
 * <li>className - 实体类的类名。必选，唯一键。
 * <li>alias - 指定的别名。必选，唯一键。
 * <li>typeInfo - 对应的类型信息。
 * </ol>
 * 
 * @author lxm
 * 
 */
class EntityInfoBuffer {

  private ArrayList recordList = new ArrayList();

  /**
   * 清除所有数据。
   * 
   */
  public void clear() {
    recordList.clear();
  }

  /**
   * 添加类信息。
   * 
   * @param className
   *          指定的类名。不可为Null。
   * @param alias
   *          指定的别名。允许null，意味着别名取自className。
   * @return 返回className对应的类记录。
   */
  public Record add(String className, String alias) throws ClientBizException {
    assert className != null;
    String newAlias = alias != null ? alias : className;

    Record record2 = this.getByAlias(newAlias);
    if (record2 != null && record2.getClassName().equals(className))
      throw new ClientBizException("别名(" + alias + ")重复。");

    Record record = this.getByClassName(className);
    if (record == null) {
      record = new Record();
      record.setClassName(className);
      record.setAlias(newAlias);
      recordList.add(record);
    } else {
      record.setAlias(alias);
    }
    return record;
  }

  /**
   * 删除指定的类记录。
   * 
   * @param record
   *          指定的类记录对象。不可为null。
   */
  public void remove(Record record) {
    assert record != null;
    recordList.remove(record);
  }

  /**
   * 取得类信息记录。
   * 
   * @param key
   *          指定的类名或别名。不可为null。
   * @return 返回取得的类记录，若找不到则返回null。
   */
  public Record get(String key) {
    assert key != null;
    Record record = this.getByClassName(key);
    if (record == null)
      record = this.getByAlias(key);
    return record;
  }

  /**
   * 判断是否包含指定类记录。
   * 
   * @param key
   *          指定的类名或别名。不可为null。
   * @return
   */
  public boolean contains(String key) {
    assert key != null;
    return this.get(key) != null;
  }

  /**
   * 取得所有包含的实体类名。
   * 
   * @return set of String，若没有包含任何实体的信息，则返回一个空的列表。
   */
  public Set classNameSet() {
    Set set = new HashSet();
    for (int i = 0; i < recordList.size(); i++) {
      Record record = (Record) recordList.get(i);
      set.add(record.getClassName());
    }
    return set;
  }

  /**
   * 将指定的用户友好字符串转换为可运行字符串。
   * 
   * @param friendlyStr
   *          指定的用户友好字符串。
   * @return 返回可运行字符串
   * @throws ClientBizException
   */
  public String toRunnableStr(String friendlyStr) throws ClientBizException {
    // TODO
    return friendlyStr;
  }

  /**
   * 将可运行字符串转换为用户友好字符串。
   * 
   * @param runnableStr
   *          指定的可运行字符串。
   * @return 返回用户友好字符串。
   * @throws ClientBizException
   */
  public String toFriendlyStr(String runnableStr) throws ClientBizException {
    // TODO
    return runnableStr;
  }

  private Record getByClassName(String className) {
    assert className != null;
    for (int i = 0; i < recordList.size(); i++) {
      Record record = (Record) recordList.get(i);
      assert record != null;
      if (record.getClassName().equals(className))
        return record;
    }
    return null;
  }

  private Record getByAlias(String alias) {
    assert alias != null;
    for (int i = 0; i < recordList.size(); i++) {
      Record record = (Record) recordList.get(i);
      assert record != null;
      if (record.getAlias().equals(alias))
        return record;
    }
    return null;
  }

  /**
   * 类信息记录。
   * 
   * @author lxm
   * 
   */
  public class Record {

    private String className;
    private String alias;
    private ClassTypeInfo typeInfo;

    /** 别名 */
    public String getAlias() {
      return alias != null ? alias : className;
    }

    /** 别名 */
    public void setAlias(String alias) {
      this.alias = alias;
    }

    /** 类名 */
    public String getClassName() {
      return className;
    }

    /** 类名 */
    public void setClassName(String className) {
      this.className = className;
    }

    /** 类型信息 */
    public ClassTypeInfo getTypeInfo() {
      return typeInfo;
    }

    /** 类型信息 */
    public void setTypeInfo(ClassTypeInfo typeInfo) {
      this.typeInfo = typeInfo;
    }
  }
}
